package com.bdqn.wr.config;

import com.bdqn.wr.security.CustomUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomUserService customUserService;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人都能访问，功能页只有 有权限的人才能访问
        //authorizeRequests() 认证请求    permitAll()都能访问    hasRole（）哪个能访问
        //授权规则
        http.authorizeRequests().antMatchers("/").permitAll()
                                .antMatchers("/level1/**").hasRole("用户")
                                .antMatchers("/level2/**").hasRole("管理员")
                                .antMatchers("/level3/**").hasRole("系统管理员");

        //没有权限默认跳转登录页
//        http.formLogin();

        //自定义登录页面   前端username 属性  和password的属性                   loginProcessingUrl：这里是表单提交地址那边是什么这边写什么，通过这个地址实现登录 成功就放行
        http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login1").permitAll();

        //注销  开启注销功能
        http.csrf().disable();//关闭csrf功能
        http.logout().logoutSuccessUrl("/").permitAll();

        //开启记住我功能  自定义接收前端的参数
        http.rememberMe().rememberMeParameter("remember"); //默认保存2周
    }


    //认证  springboot 2.1.x 可以直接使用
//    报错 no PasswordEncoder： 密码编码问题 在security 5.0+需要加密，新增了加密方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserService);
    }

}
